// main.go
// @title Odysseus_DiTing API
// @version 1.0
// @description 告警转发服务：支持企业微信、飞书、钉钉
// @host localhost:8080
// @schemes http
package main

import (
	"fmt"
	"log"
	"v2/config"
	"v2/dingtalk"
	_ "v2/docs"
	"v2/feishu"
	"v2/logger"
	"v2/routes"
	"v2/util"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	swaggerFiles "github.com/swaggo/files"     // swagger embed files
	ginSwagger "github.com/swaggo/gin-swagger" // gin-swagger middleware
	// "v2/metrics"
	// "v2/middleware"
)

func main() {
	logger.SetupLogger() // 初始化日志
	logger.SugaredLogger.Info("🚀 日志系统已启动")

	if err := config.Load("config.yaml"); err != nil {
		log.Fatalf("❌ 配置加载失败: %v", err)
	}
	// 打印飞书配置以确认
	log.Printf("[FeiShu] 配置检查: enable=%v", config.Global.Notifier.FeiShuStream.Enable)
	log.Printf("[FeiShu] 配置检查: app_id=%s", config.Global.Notifier.FeiShuStream.AppID)
	log.Printf("[FeiShu] 配置检查: app_secret=%s", config.Global.Notifier.FeiShuStream.AppSecret)
	log.Printf("[FeiShu] 配置检查: receive_id_type=%s", config.Global.Notifier.FeiShuStream.ReceiveIDType)
	log.Printf("[FeiShu] 配置检查: alert_card_template_id=%s", config.Global.Notifier.FeiShuStream.AlertCardTemplateID)

	if err := util.InitRedisClient(); err != nil {
		log.Printf("⚠️ Redis 初始化失败: %v", err)
		// 可以选择继续运行或退出
		// log.Fatal("Redis 初始化失败")
	} else {
		log.Println("✅ Redis 初始化成功")
	}

	// 创建飞书 Stream 处理器
	feishuStreamHandler := feishu.GetFeishuStreamHandler()

	// 启动飞书 Stream 连接
	feishuStreamHandler.Start()

	// 设置飞书 Stream 处理器到路由
	routes.SetFeishuStreamHandler(feishuStreamHandler)

	// 创建钉钉 Stream 处理器
	dingTalkStreamHandler := dingtalk.GetDingTalkStreamHandler()

	// 启动钉钉 Stream 连接
	dingTalkStreamHandler.Start()

	// 设置钉钉 Stream 处理器到路由
	routes.SetDingTalkStreamHandler(dingTalkStreamHandler)

	// dingtalkNotifier := dingtalk.NewDingTalkStreamNotifier()

	// // 启动钉钉 Stream 连接
	// if err := dingtalkNotifier.Start(); err != nil {
	// 	log.Printf("⚠️ 钉钉 Stream 启动失败: %v", err)
	// } else {
	// 	log.Println("✅ 钉钉 Stream 连接已启动")
	// }

	r := gin.Default()
	r.GET("/favicon.ico", func(c *gin.Context) {
		c.Status(204) // 返回 204 No Content
	})
	// 使用middleware 普罗米修斯的耗时 这里我注释掉了
	// r.Use(middleware.MetricsMiddleware())
	// 注册 /alert 路由组
	routes.SetupAlertRoutes(r)
	// HealthCheck godoc
	// @Summary 健康检查
	// @Description 健康检查接口
	// @Tags Health
	// @Produce json
	// @Success 200 {object} gin.H
	// @Router /health [get]
	r.GET("/health", func(c *gin.Context) {
		c.JSON(200, gin.H{"status": "ok"})
	})

	// 注册 Swagger 路由
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	//注册指标
	r.GET("/metrics", gin.WrapH(promhttp.Handler()))

	port := config.Global.Server.Port
	log.Printf("🚀 服务启动中，监听 :%d", port)
	if err := r.Run(fmt.Sprintf(":%d", port)); err != nil {
		log.Fatalf("❌ 启动失败: %v", err)
	}
}
